<?php
require_once 'BancoDeDados.php';
require_once 'Objeto.php';
class Estilo {

    private $cod_estilo;
    private $descricao;
    private $vinculado;
    private $objeto;

    public function getCod_estilo() {
        return $this->cod_estilo;
    }

    public function setCod_estilo(&$cod_estilo) {
        $this->cod_estilo = &$cod_estilo;
    }

    public function getDescricao() {
        return $this->descricao;
    }

    public function setDescricao(&$Descricao) {
        $this->descricao = &$Descricao;
    }

    public function isVinculado() {
        return $this->vinculado;
    }

    private function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }

    /**
     *
     * @return Objeto
     */
    public function &getObjeto() {
        return $this->objeto;
    }

    public function setObjeto(Objeto &$objeto) {
        $this->objeto = &$objeto;
    }
    
    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Estilo existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into estilo (descricao) values(?)');
        $result = $link->execute($stmt, array($this->descricao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'descricao') {
            $this->descricao = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Estilo existente");
            }
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update estilo set ' . $campo_id . ' = ? where cod_estilo = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_estilo));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from estilo where cod_estilo = ?');
        $result = $link->execute($stmt, array($this->cod_estilo));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public static function listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from estilo');
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $estilo = new Estilo();
            $estilo->setCod_estilo($row['cod_estilo']);
            $estilo->setDescricao($row['descricao']);
            $estilo->setVinculado($estilo->verificarVinculacao());
            $resultado[] = &$estilo;
            unset($estilo);
        }
        return $resultado;
    }

    public static function consultar(Objeto &$objeto, &$cod_estilo) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from estilo where cod_estilo = ?', array($cod_estilo));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if($result->numRows() == 0) {
            throw new Exception("Estilo inexistente");
        } elseif($result->numRows() > 1) {
            throw new Exception("Mais de um Estilo com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $estilo = new Estilo();
        $estilo->setCod_estilo($row['cod_estilo']);
        $estilo->setDescricao($row['descricao']);
        $estilo->setObjeto($objeto);
        return $estilo;
    }

    private function validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_estilo from estilo where descricao = ?', array($this->descricao));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 0;
        }
        return 1;
    }

    private function verificarVinculacao() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_estilo from objeto where cod_estilo = ?', array($this->cod_estilo));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 1;
        }
        return 0;
    }

    public function cadastrarObjeto() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_estilo from objeto where cod_estilo = ? and cod_interno = ?', array($this->cod_estilo, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            throw new Exception('Estilo existente');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update objeto set cod_estilo = ? where cod_interno = ?');
        $result = $link->execute($stmt, array($this->cod_estilo, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluirObjeto() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update objeto set cod_estilo = null where cod_interno = ?');
        $result = $link->execute($stmt, array($this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }
}
 ?>